'use strict';

var express = require('express');
var timeout = require('connect-timeout');
var path = require('path');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var AV = require('leanengine');
var URL = require('url');

// 加载云函数定义，你可以将云函数拆分到多个文件方便管理，但需要在主文件中加载它们
require('./cloud');

var app = express();

// 设置模板引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(express.static('public'));

// 设置默认超时时间
app.use(timeout('15s'));

// 加载云引擎中间件
app.use(AV.express());

app.enable('trust proxy');
// 需要重定向到 HTTPS 可去除下一行的注释。
// app.use(AV.Cloud.HttpsRedirect());

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
	extended: false
}));
app.use(cookieParser());

app.get('/', function(req, res) {
	/*res.render('index', {
		currentTime: new Date()
	});*/
	var data = URL.parse(req.url, true).query;
	// 打印get请求中的接口参数
	var signature = data.signature;
	var timestamp = data.timestamp;
	var nonce = data.nonce;
	var echostr = data.echostr;
	console.log(data);
	//res.end(JSON.stringify(params));
	res.end(echostr);
});

//xml解析模块
var XMLJS = require('xml2js');
//解析，将xml解析为json
var parser = new XMLJS.Parser();
//重组，将json重组为xml
var builder = new XMLJS.Builder();

//微信事件推送的入口
app.post('/', function(req, res, next) {
	console.log(JSON.stringify(req.data));
	//获取xml数据
	var data = '';
	req.on('data', function(chunk) {
		data += chunk;
	});

	req.on("end", function() {
		console.log(JSON.stringify(data));
		//将xml解析
		parser.parseString(data.toString(), function(err, result) {
			var body = result.xml;
			var messageType = body.MsgType[0];
			console.log("messageType：" + messageType);
			//用户点击菜单响应事件
			if(messageType === 'event') {
				var eventName = body.Event;
				(EventFunction[eventName] || function() {})(body, req, res);
				//自动回复消息
			} else if(messageType === 'text') {
				console.log("responseNews:");
				EventFunction.responseNews(body, res);
				//第一次填写URL时确认接口是否有效
			} else {
				//res.send(echostr);
			}
		});
	});
});

//微信客户端各类回调用接口
var EventFunction = {
	//关注
	subscribe: function(result, req, res) {
		//存入openid 通过微信的接口获取用户的信息同时存入数据库。
	},
	//注销
	unsubscribe: function(openid, req, res) {
		//删除对应id
	},
	//打开某个网页
	VIEW: function() {
		//根据需求，处理不同的业务
	},
	//自动回复
	responseNews: function(body, res) {
		console.log("responseNews");
		//组装微信需要的json
		var xml = {
			xml: {
				ToUserName: body.FromUserName,
				FromUserName: body.ToUserName,
				CreateTime: +new Date(),
				MsgType: 'text',
				Content: '编辑@+您想说的话，我们可以收到'
			}
		};
		var reciviMessage = body.Content;
		console.log("reciviMessage:" + reciviMessage);
		if(/^\@.*/.test(reciviMessage)) {
			xml.xml.Content = '已经收到您的建议，会及时处理！'
		}
		//将json转为xml
		xml = builder.buildObject(xml); //发送给微信
		res.send(xml);
	}
}

// 可以将一类的路由单独保存在一个文件中
app.use('/todos', require('./routes/todos'));

app.use('/wx', require('./routes/wx'));

app.use(function(req, res, next) {
	// 如果任何一个路由都没有返回响应，则抛出一个 404 异常给后续的异常处理器
	if(!res.headersSent) {
		var err = new Error('Not Found');
		err.status = 404;
		next(err);
	}
});

// error handlers
app.use(function(err, req, res, next) {
	if(req.timedout && req.headers.upgrade === 'websocket') {
		// 忽略 websocket 的超时
		return;
	}

	var statusCode = err.status || 500;
	if(statusCode === 500) {
		console.error(err.stack || err);
	}
	if(req.timedout) {
		console.error('请求超时: url=%s, timeout=%d, 请确认方法执行耗时很长，或没有正确的 response 回调。', req.originalUrl, err.timeout);
	}
	res.status(statusCode);
	// 默认不输出异常详情
	var error = {};
	if(app.get('env') === 'development') {
		// 如果是开发环境，则将异常堆栈输出到页面，方便开发调试
		error = err;
	}
	res.render('error', {
		message: err.message,
		error: error
	});
});

module.exports = app;